﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using BusinessLayer;
using Common;

namespace BoletoElectronicoDesktop.AbmUsuario
{
    #region

    #endregion

    public partial class FormAbmUsuario : FormAddModify
    {

        public FormAbmUsuario(Common.Util.Funcionalidad Use): base(Use)
        {
            InitializeComponent();
            Load += new EventHandler(FormAbmUsuario_Load);
        }
        public FormAbmUsuario(int Id, Common.Util.Funcionalidad Use)
            : base(Id, Use)
        {
            InitializeComponent();
            Load +=new EventHandler(FormAbmUsuario_Load);
        }

        public dsBoleto.RolDataTable srcExistentRoles { get; set; }
        public dsBoleto.RolDataTable srcPossessedRoles { get; set; }
        private bool renovarPass { get; set; }
        private ErrorSummary _errSum;
        private ErrorSummary errSum
        {
            get
            {
                if (_errSum == null)
                {
                    _errSum = new ErrorSummary();
                }
                return _errSum;
            }
            set
            {
                _errSum = value;
            }
        }
        void FormAbmUsuario_Load(object sender, EventArgs e)
        {
         
                
            
            switch (Uso)
            {
                case BoletoElectronicoDesktop.FormAddModify.CallType.Add:
                    LoadFormData();
                    break;
                case BoletoElectronicoDesktop.FormAddModify.CallType.Modify:
                    LoadUser(Id);
                    break;
                default:
                    break;
            }
            errProv.SetError(txtUser, string.Empty);
            
            
        }

        private void LoadFormData()
        {
            btnRenovarPass.Enabled = false;
            dsBoleto dsR = BizRol.retrieveRoles();
            srcExistentRoles = dsR.Rol;
            lbxExistent.DataSource = srcExistentRoles;
            lbxExistent.DisplayMember = "Descripcion";
            errProv.SetError(txtUser, string.Empty);

            srcPossessedRoles = new dsBoleto.RolDataTable();
            lbxPossess.DataSource = srcPossessedRoles;
            lbxPossess.DisplayMember = "Descripcion";
        }

        private void LoadUser(int Id)
        {
            dsBoleto ds = BizUser.LoadUser(Id);
            srcPossessedRoles = ds.Rol;
            lbxPossess.DataSource = srcPossessedRoles;
            lbxPossess.DisplayMember = "Descripcion";

            txtUser.Text = ds.Usuario[0].Username;

            dsBoleto dsR = BizUser.LoadUserWithUnselectedRoles(Id);
            srcExistentRoles = dsR.Rol;
            lbxExistent.DataSource = srcExistentRoles;
            lbxExistent.DisplayMember = "Descripcion";
        }

        private void AddUser()
        {
            BizUser.InsertUser(txtUser.Text,Util.ListBoxToListInt(lbxPossess,"IdRol"));
        }

        private void UpdateUser()
        {
            List<int> items = new List<int>();
            foreach (DataRowView item in lbxPossess.Items)
            {
                items.Add(((dsBoleto.RolRow)item.Row).IdRol);
            }
            BizUser.UpdateUser(Id, renovarPass, items);
        }

        private void btnRenovarPass_Click(object sender, EventArgs e)
        {
            renovarPass = true;
            this.btnRenovarPass.Enabled = false;
        }

        private void btnAccept_Click(object sender, EventArgs e)
        {
            if (!errSum.HayErrores())
            {
                if (MessageBox.Show("¿Esta seguro que desea guardar los cambios?", "Guardar", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    switch (Uso)
                    {
                        case FormAddModify.CallType.Add:
                            AddUser();
                            break;
                        case FormAddModify.CallType.Modify:
                            UpdateUser();
                            break;
                        case FormAddModify.CallType.Other:
                            break;
                    }

                    FormUsuarioList frm;
                    if (this.MdiParent.MdiChildren.Any(f => f is FormUsuarioList))
                    {
                        frm = (FormUsuarioList)this.MdiParent.MdiChildren.First(f => f is FormUsuarioList);
                        frm.Search();   
                        frm.Show();
                    }

                    this.Close();
                }
            }
            else
            {
                lblErr.Text = errSum.ToString();
            }
        }

        private void txtUser_Validating(object sender, CancelEventArgs e)
        {
            int len = this.txtUser.Text.Length;
            bool nok = false;
            StringBuilder sb = new StringBuilder();
            if (len > 255)
            {
                sb.AppendLine("No se permite un nombre de usuario tan largo. ");
                sb.AppendLine("Escriba un nombre de usuario de menos de 255 caracteres. ");
                nok = true;
            }
            else if (len < 3)
            {
                sb.AppendLine("No se permite un nombre de usuario tan corto. ");
                sb.AppendLine("Escriba un nombre de usuario de menos de 3 caracteres. ");
                nok = true;
            }

            if (nok)
            {
                sb.Append("Usted escribió ");
                sb.Append(len);
                sb.AppendLine(" caracteres.-");
                errProv.SetError(txtUser, sb.ToString());
                errSum.AddOrOverwriteItem(txtUser, sb.ToString());
            }
            else
            {
                errSum.RemoveItem(txtUser);
                errProv.SetError(txtUser, string.Empty);
            }

            if (lblErr.Visible = errSum.HayErrores())
            {
                
            }
            lblErr.Text = errSum.ToString();
        }

        #region HandleRolesButtons

        private void btnAdd_Click(object sender, EventArgs e)
        {
            List<DataRowView> items = new List<DataRowView>();
            foreach (DataRowView item in lbxExistent.SelectedItems)
            {
                items.Add(item);
                dsBoleto.RolRow rr = srcPossessedRoles.NewRolRow();
                rr.IdRol = ((dsBoleto.RolRow)item.Row).IdRol;
                rr.Descripcion = ((dsBoleto.RolRow)item.Row).Descripcion;
                //rr.Habilitado = ((dsBoleto.RolRow)item.Row).Habilitado;
                srcPossessedRoles.AddRolRow(rr);
            }

            items.ForEach(item => srcExistentRoles.RemoveRolRow((dsBoleto.RolRow)item.Row));


        }

        private void btnRmv_Click(object sender, EventArgs e)
        {
            List<DataRowView> items = new List<DataRowView>();
            foreach (DataRowView item in lbxPossess.SelectedItems)
            {
                items.Add(item);
                dsBoleto.RolRow rr = srcExistentRoles.NewRolRow();
                rr.IdRol = ((dsBoleto.RolRow)item.Row).IdRol;
                rr.Descripcion = ((dsBoleto.RolRow)item.Row).Descripcion;
                //rr.Habilitado = ((dsBoleto.RolRow)item.Row).Habilitado;
                srcExistentRoles.AddRolRow(rr);
            }

            items.ForEach(item => srcPossessedRoles.RemoveRolRow((dsBoleto.RolRow)item.Row));

        }

        private void btnAddAll_Click(object sender, EventArgs e)
        {
            List<DataRowView> items = new List<DataRowView>();
            foreach (DataRowView item in lbxExistent.Items)
            {
                items.Add(item);
                dsBoleto.RolRow rr = srcPossessedRoles.NewRolRow();
                rr.IdRol = ((dsBoleto.RolRow)item.Row).IdRol;
                rr.Descripcion = ((dsBoleto.RolRow)item.Row).Descripcion;
                //rr.Habilitado = ((dsBoleto.RolRow)item.Row).Habilitado;
                srcPossessedRoles.AddRolRow(rr);
            }

            items.ForEach(item => srcExistentRoles.RemoveRolRow((dsBoleto.RolRow)item.Row));

        }

        private void btnRmvAll_Click(object sender, EventArgs e)
        {
            List<DataRowView> items = new List<DataRowView>();
            foreach (DataRowView item in lbxPossess.Items)
            {
                items.Add(item);
                dsBoleto.RolRow rr = srcExistentRoles.NewRolRow();
                rr.IdRol = ((dsBoleto.RolRow)item.Row).IdRol;
                rr.Descripcion = ((dsBoleto.RolRow)item.Row).Descripcion;
                //rr.Habilitado = ((dsBoleto.RolRow)item.Row).Habilitado;
                srcExistentRoles.AddRolRow(rr);
            }

            items.ForEach(item => srcPossessedRoles.RemoveRolRow((dsBoleto.RolRow)item.Row));

        }
        #endregion

        private void btnCancel_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("¿Esta seguro que desea Cancelar? Si lo hace perdera los cambios realizados.",
                "Cancelar",
                MessageBoxButtons.YesNo)
                == DialogResult.Yes)
                this.Close();
        }


    }
}
